package random

import (
	"io"
	"os"
	"os/exec"

	"github.com/creack/pty"
)

func Run() {
	// 运行 grep --color bar 这个命令，将他这个命令连接到一个用pty运行的的伪终端 -- 应该也是在子进程之中
	//c := exec.Command("grep", "--color=auto", "bar")
	c := exec.Command("/bin/bash")
	f, err := pty.Start(c)
	if err != nil {
		panic(err)
	}

	// 启动一个新的 goroutine 来异步地向伪终端的【主端】写入数据。
	// 这些数据将被传递给 grep 命令作为标准输入。
	go func() {
		// 向伪终端写入几行文本：
		f.Write([]byte("foo\n")) // 不包含关键字 "bar"，所以不会被 grep 输出
		f.Write([]byte("bar\n")) // 包含关键字 "bar"，因此会被 grep 捕获并以彩色输出。
		f.Write([]byte("xyz\n")) // 不包含关键字 "bar"，所以也不会被输出。
		//f.Write([]byte{4})       // 发送 EOT（End of Transmission）字符，表示输入结束。这通常会终止 grep 进程或使其准备好接收新的输入。
	}()

	// 将伪终端主端 f 的所有输出复制到标准输出 os.Stdout。
	// 这意味着任何由 grep 命令产生的输出都会直接显示在当前终端上。
	io.Copy(os.Stdout, f)
}
